package common

import (
	"math/rand"
	"os"
	"os/exec"
	"strings"

	"gopkg.in/yaml.v2"
)

const BASIC_RANDOM_WORDS = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"

// 生成随机数
// @param len 生成随机码的长度
// @param radix 随机字符采样基数
func RandomWord(len, radix int) string {
	// 创建接收字节的数组
	bytes := make([]byte, len)
	for i := range bytes {
		bytes[i] = BASIC_RANDOM_WORDS[rand.Intn(radix)]
	}
	return string(bytes)
}

func IsBlank(text string) bool {
	if len(strings.ReplaceAll(text, " ", "")) == 0 || text == "" {
		return true
	}
	return false
}

// @title         YamlFileParserWithFilePath
// @description   yaml 文件解析器
// @author        geore<geore@foxmail.com>
// @param         filePath  string yaml文件路径
// @param         loadModel any    yaml文件解析数据装载器
// @return        error     error  错误信息
func YamlFileParserWithFilePath(filePath string, loadModel any) error {
	fileData, err := os.ReadFile(filePath)

	if nil != err {
		loadModel = nil
		return err
	}
	yaml.Unmarshal(fileData, loadModel)
	return nil
}

// @title         YamlFileParserWithFileData
// @description   yaml 文件解析器
// @author        geore<geore@foxmail.com>
// @param         fileData  []byte yaml文件数据
// @param         loadModel any    yaml文件解析数据装载器
func YamlFileParserWithFileData(fileData []byte, loadModel any) error {
	err := yaml.Unmarshal(fileData, loadModel)
	return err
}

// 判断元素是否在切片中
func Contains(slice []string, target string) bool {
	set := make(map[string]any, len(slice))

	for _, item := range slice {
		set[item] = struct{}{}
	}
	_, ok := set[target]
	return ok
}

// 网络状态监控
func NetWorkStatus() bool {
	cmd := exec.Command("ping", "www.baidu.com", "-c", "1", "-W", "5")
	err := cmd.Run()
	// err == nil 表示网络状态正常
	return err == nil
}

// 判断文件是否存在
func PathExists(path string) (bool, error) {
	_, err := os.Stat(path)
	if err == nil {
		return true, nil
	}

	// 如果 os.IsNotExist(err) 表示是路径不存在产生的错误
	if os.IsNotExist(err) {
		return false, nil
	}

	// 不确定是否存在,报错信息
	return false, err
}
